﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.Xml;
using System.Text;

using LINQToolKit.GData;
using LINQToolKit.Douban.Entities;
using AllSharing.Extensions;

namespace  LINQToolKit.Douban
{
    /// <summary>
    /// Demos for LINQToolKit.Douban
    /// </summary>
    /// <remarks>
    /// This framework is under the GNU licence and Creative Commons 3.0.
    /// You can also get a copy of the source code from google code
    /// <see cref="http://linqtodouban.googlecode.com/svn/trunk/"/>.
    /// For more information and further support, please contace with kevin (chwkai@gmail.com)
    /// </remarks>
    class Program
    {
        static void Main(string[] args)
        {
            var context = new DoubanContext();
            // 用于输出查询的url
            context.Log = Console.Out;
            context.Me.Title.Dump();

            // 回复广播（需要授权）
            // context.CommentMiniBlog("miniBlogId", "content");
            // 参与指定活动（需要授权）
            //context.ParticipateEvent("eventId");
            // 对活动感兴趣（需要授权）
            // context.FollowEvent("eventId");
            // 退出活动（需要授权）
            // context.QuitEvent("eventId");
            // 删除活动（需要授权）
            // context.DeleteEvent("eventId", "reason");
            // 回复推荐
            // context.CommentOnReco("recommendId", "content");
            // 删除推荐的回复
            // context.DeleteCommentOnReco("recommendId", commentId);
            // 批量设置豆油已读
            // context.SetMailsRead(string[] mails);
            // 批量删除豆油
            // context.DeleteMails(string[] mails);
            // 验证access token是否可用
            // context.IsTokenAvailabe(token);
            // 注销token
            // context.CancelToken(token);
        }

        /// <summary>
        /// 获取用户豆油（需要授权，只能看Me的）
        /// </summary>
        /// <param name="context"></param>
        private static void GetUserMails(DoubanContext context)
        {
            // 未读邮件
            // context.Me.UnReadMails;
            // 已发邮件
            // context.Me.OutboxMails;
            foreach (var item in context.Me.Mails)
            {
                item.Title.Dump();
            }
        }

        /// <summary>
        /// 获取用户所有推荐
        /// </summary>
        /// <param name="context"></param>
        private static void GetUserRecos(DoubanContext context)
        {
            foreach (var item in context.Me.Recommends)
            {
                item.Title.Dump();

                //获取推荐回复
                foreach (var cc in item.Comments)
                {
                    cc.Title.Dump();
                }
            }
        }

        /// <summary>
        /// 获取指定城市id的活动
        /// </summary>
        /// <param name="context"></param>
        private static void GetLocationEvents(DoubanContext context)
        {
            var events =
                (from e in context.Events
                 where e.Location.ID == "beijing"
                 select e).Take(10);

            foreach (var item in events)
            {
                item.Title.Dump();
            }
        }

        /// <summary>
        /// 获取指定用户所有活动
        /// </summary>
        /// <param name="context"></param>
        private static void GetUserEvents(DoubanContext context)
        {
            // 用户参与的活动
            //context.Me.ParticipateEvents
            // 用户感兴趣的活动
            //context.Me.WishEvents
            // 用户发起的活动
            //context.Me.InitiateEvents
            foreach (var item in context.Me.Events)
            {
                item.Title.Dump();
            }
        }

        /// <summary>
        /// 获取用户所有日记（延迟加载）
        /// </summary>
        /// <param name="context"></param>
        private static void GetUserNotes(DoubanContext context)
        {
            foreach (var item in context.Me.Notes)
            {
                item.Title.Dump();
            }
        }

        /// <summary>
        /// 获取指定用户广播
        /// </summary>
        /// <param name="context"></param>
        private static void GetUserMiniBlogs(DoubanContext context)
        {
            var user = context.Peoples.GetByID("ahbei");

            foreach (var item in user.MiniBlogs)
            {
                item.Title.Dump();

                // 获取广播回复
                foreach (var c in item.Comments)
                {
                    c.Title.Dump();
                }
            }
        }

        /// <summary>
        /// 获取友邻广播
        /// </summary>
        /// <param name="context"></param>
        private static void GetContactMiniBlogs(DoubanContext context)
        {
            foreach (var item in context.Me.ContactMiniBlogs)
            {
                item.Title.Dump();
            }
        }

        /// <summary>
        /// 获取指定用户收藏
        /// </summary>
        /// <remarks>
        /// 此处以Me为例，也可以换成查询得来的People。当访问这些属性时，会自动加载数据
        /// </remarks>
        /// <param name="context"></param>
        private static void GetPeopleCollections(DoubanContext context)
        {
            // 获取音乐收藏
            // context.Me.Musics
            // 获取电影收藏
            // context.Me.Movies
            // 获取书籍搜藏
            foreach (var item in context.Me.Books)
            {
                item.Title.Dump();
            }
        }

        /// <summary>
        /// 删除指定id的评论
        /// </summary>
        /// <param name="context"></param>
        private static void DeleteReview(DoubanContext context)
        {
            // 代码中的id更换为有效id
            var review = context.Reviews.GetByID("2902263");
            context.Reviews.Delete(review.ID);
        }

        /// <summary>
        /// 更新指定的id的评论
        /// </summary>
        /// <param name="context"></param>
        private static void UpdateReview(DoubanContext context)
        {
            // 代码中的id更换为有效id
            var review = context.Reviews.GetByID("2902263");
            review.Content = "Udpat content test for linq2douban";
            context.Reviews.Update(review.ID, review);
        }

        /// <summary>
        /// 发表评论
        /// </summary>
        /// <remarks>
        /// 发表短的Content内容，douban api会报失败
        /// </remarks>
        /// <param name="context"></param>
        private static void AddReview(DoubanContext context)
        {
            var review = new Review
            {
                // 如果Subject是从API读回来的，Source属性会自动赋值
                Subject = new Movie { Source = "http://api.douban.com/movie/subject/1424406" },
                Rating = new Rating { Value = 4 },
                Content = "this is the test for linq2doubanddddddddddddddddddddddddddddddddddddddddd",
                Title = "this is the test for linq2douban"
            };

            context.Reviews.Insert(review);
        }

        /// <summary>
        /// 获取指定书籍/电影/音乐的评论
        /// </summary>
        /// <param name="context"></param>
        private static void GetSubjectReviews(DoubanContext context)
        {
            var movie = context.Movies.GetByID("1424406");
            movie.Reviews.Count().Dump();
        }

        /// <summary>
        /// 获取用户所有评论
        /// </summary>
        /// <remarks>
        /// 此例用me做示例，获取指定的用户的评论，访问People.Reviews属性即可，框架会延迟加载
        /// </remarks>
        /// <param name="context"></param>
        private static void GetReviews(DoubanContext context)
        {
            foreach (var item in context.Me.Reviews)
            {
                item.Title.Dump();
            }
        }

        /// <summary>
        /// 示例复合查询（关键字，startindex，maxtresult）
        /// </summary>
        /// <remarks>
        /// douban的startindex, maxresult的含义与常识理解不通，
        /// douban的maxresult表示取回数据的最大下标，所以Take(20).Skip(10)返回下标为10-20共11条数据
        /// </remarks>
        /// <param name="context"></param>
        private static void GetBooks(DoubanContext context)
        {
            var query = context.Books.Has("新东方").Take(20).Skip(10);

            foreach (var item in query)
            {
                item.Title.Dump();
            }
        }

        /// <summary>
        /// 用多个条件查询书籍（电影、音乐等，查询同此例）
        /// </summary>
        /// <remarks>
        /// LINQToolKit会根据queries.config里定义的query rules转换成相应的url进行查询，
        /// 你可尝试用不同关键字匹配，如果有问题请发chwkai@gmail.com
        /// </remarks>
        /// <param name="context"></param>
        private static void GetBooksByQuery(DoubanContext context)
        {
            var query =
                from b in context.Books
                where b.LongIsbn == "9787543639133" || b.ID == "2023013"
                select b;

            foreach (var item in query)
            {
                item.Title.Dump();
            }
        }

        /// <summary>
        /// 获取指定ID的书籍
        /// </summary>
        /// <remarks>
        /// 获取指定ID的douban信息与此例相同
        /// </remarks>
        /// <param name="context"></param>
        private static void GetBookByID(DoubanContext context)
        {
            var query =
                from b in context.Books
                where b.ID == "2023013"
                select b;
            query.Single().Dump();
        }

        /// <summary>
        /// 获取用户关注的人（延迟加载）
        /// </summary>
        /// <param name="context"></param>
        private static void GetContacts(DoubanContext context)
        {
            // context.Me.Contacts 获取当前用户关注的人

            var query =
                from p in context.Peoples
                where p.ID == "chwkai"
                select p;

            // People.Contacts 当需要访问时会延迟加载
            query.Single().Contacts.Count().Dump();
        }

        /// <summary>
        /// 获取用户朋友（延迟加载）
        /// </summary>
        /// <param name="context"></param>
        private static void GetFriends(DoubanContext context)
        {
            // context.Me.Friends 获取当前用户的朋友

            var query =
                from p in context.Peoples
                where p.ID == "chwkai"
                select p;

            // People.Friends 当需要访问时会延迟加载
            query.Single().Friends.Count().Dump();
        }

        /// <summary>
        /// 关键字搜索用户
        /// </summary>
        /// <remarks>
        /// 不是ID的相等比较条件都会转换为关键字查询
        /// </remarks>
        /// <param name="context"></param>
        private static void GetUserByKey2(DoubanContext context)
        {
            var query =
                from p in context.Peoples
                where p.Title == "net"
                select p;
            query.Count().Dump();
        }

        /// <summary>
        /// 关键字搜索用户
        /// </summary>
        /// <param name="context"></param>
        private static void GetUserByKey(DoubanContext context)
        {
            var query = context.Peoples.Has("net");
            query.Count().Dump();
        }

        /// <summary>
        /// 获取当前用户（需要授权）
        /// </summary>
        /// <param name="context"></param>
        private static void GetCurrentUser(DoubanContext context)
        {
            context.Me.Content.Dump();
        }

        /// <summary>
        /// 获取单个用户信息
        /// </summary>
        /// <param name="context"></param>
        private static void GetOneUserLinqStyle(DoubanContext context)
        {
            var user =
                from u in context.Peoples
                where u.ID == "chwkai"
                select u;
            user.Single().Content.Dump();
        }

        /// <summary>
        /// 获取单个用户信息
        /// </summary>
        /// <param name="context"></param>
        private static void GetOneUser(DoubanContext context)
        {
            var user = context.Peoples.GetByID("chwkai");
            user.Content.Dump();
        }

    }
}
